//
//  PartTemplateSpecialization.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/21.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef PartTemplateSpecialization_hpp
#define PartTemplateSpecialization_hpp

#include <stdio.h>
#include <iostream>
#include <cstring>

template <class T,int size>

class StaticArray2 {
private:
    T m_array[size];
    
public:
    
    T *getArray(){
        return m_array;
    }
    
    T &operator[](int index){
        return m_array[index];
    }
    //类成员函数不提供部分特化，只能部分特化整个类
    void print(){
        for (int i = 0; i <size; ++i) {
            std::cout << m_array[i] << ' ';
        }
        std::cout << "\n";
    }
    
};

template <class T,int size>
void printStaticArray(StaticArray2<T,size> &array){
    for (int i = 0; i < size; ++i) {
        std::cout << array[i] <<" ";
    }
}

//函数部分特化
template <int size>
void printStaticArray(StaticArray2<char,size> &array){
    for (int i = 0; i < size; ++i) {
        std::cout << array[i];
    }
}


//类成员函数不提供部分特化，只能部分特化整个类(但一般不这么干，太累人了)可以使用继承（查看后一小节）

template <int size>
class StaticArray2<double,size> {
    
private:
    double m_array[size];
    
public:
    double *getArray(){
        return m_array;
    }
    
    double &operator[](int index){
        return m_array[index];
    }
    
    void print()
    {
        for (int i = 0; i < size; i++)
            std::cout << std::scientific << m_array[i] << "---";
        std::cout << "\n";
    }
    
};


#endif /* PartTemplateSpecialization_hpp */
